package io.github.source.media.bean;

import android.os.Parcelable;
import android.util.Log;

import com.google.gson.JsonElement;
import com.google.gson.annotations.SerializedName;
import com.orhanobut.logger.Logger;

import org.simpleframework.xml.Element;
import org.simpleframework.xml.ElementList;
import org.simpleframework.xml.Path;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import io.github.source.Init;
import io.github.source.bean.Episode;
import io.github.source.bean.Flag;

/**
 * @ClassName: MediaBean
 * @Description: TODO(要稳定)不依赖第三方代码不依赖第三方代码不依赖第三方代码
 * @author: huangrongcai
 * @date: 2024/6/3
 * @Copyright: 黄嵘才（HuangRc)
 */
public class MediaBean implements Serializable {
    /* json 简约信息
    {
	"vod_id": "msearch:###排球少年！！垃圾场决战###https:\/\/img3.doubanio.com\/view\/photo\/s_ratio_poster\/public\/p2909378407.jpg@Referer=https:\/\/api.douban.com\/@User-Agent=Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/110.0.0.0 Safari\/537.36",
	"vod_name": "排球少年！！垃圾场决战",
	"vod_pic": "https:\/\/img3.doubanio.com\/view\/photo\/s_ratio_poster\/public\/p2909378407.jpg@Referer=https:\/\/api.douban.com\/@User-Agent=Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/110.0.0.0 Safari\/537.36",
	"vod_remarks": "评分：8.5"
    }
     */

    /* json 详情
    {
		"vod_id": "84657",
		"vod_name": "职业杀手2023",
		"vod_pic": "https:\/\/img.lzzyimg.com\/upload\/vod\/20240607-1\/433ede93db50e03cf635eec7a36df6d0.jpg",
		"vod_year": "2023",
		"vod_remarks": "HD",
		"vod_actor": "格伦·鲍威尔 阿德里娅·阿霍纳 瑞塔·希尔丽夫 奥斯丁·阿梅里奥 莫莉·伯纳德 莫甘娜·肖 里奇·蒙哥马利 Kate Adair Mike Markoff Jo-Ann Robinson Jordan Salloum 基姆·巴蒂斯特 布莱恩特·卡罗尔 埃文·霍茲曼 朱莉娅·霍特 理查德·罗比查乌克斯 格拉伦·布莱恩特·班克斯 罗克茜·里韦拉 埃莉诺·T·斯雷特 Beth Bartley",
		"vod_director": "理查德·林克莱特",
		"vod_content": "👽公众号【神秘的哥哥们】免费分享，没APP没贩卖只有陪伴~　　　荣获奥斯卡金像奖提名的导演理查德·林克莱特执导的这部光鲜亮丽的新黑色影片由格伦·鲍威尔主演。他在片中饰演刻板的教授加里·约翰逊—新奥尔良警察局的一名兼职假杀手。加里有着异乎寻常的天赋，擅长伪装成不同的人，来抓捕那些希望击退敌人的倒霉蛋。当他被一个潜在罪犯吸引时，他陷入了道德困境：这个罪犯是一个名叫麦迪逊（阿德里娅·阿霍纳饰）的美丽年轻女子。当麦迪逊爱上加里扮演的杀手角色之一（神秘性感的罗恩）时，他们的暧昧关系引发了一系列的连锁反应，包括演戏、欺骗和不断升级的赌注。《HitMan》由林克莱特和鲍威尔共同创作，改编自一个令人难以置信的真实故事，是一部巧妙描写身份的存在主义喜剧。",
		"vod_area": "美国",
		"type_name": "喜剧",
		"type_danmu": "玩偶电影",
		"vod_play_from": "夸父原$$$夸父智",
		"vod_play_url": "职业杀手.Hit Man.2024.1080p中英字幕.mp4 [5.82GB]$quark+a35ccbf4e1c74495949136fcc644b56f+a493448cceaa6e122cd20651001140ad+职业杀手.Hit Man.2024.1080p中英字幕.mp4$$$职业杀手.Hit Man.2024.1080p中英字幕.mp4 [5.82GB]$quark+a35ccbf4e1c74495949136fcc644b56f+a493448cceaa6e122cd20651001140ad+职业杀手.Hit Man.2024.1080p中英字幕.mp4"
	}
    * */
    /**
     * (*)媒体文件ID
     */
    @Element(name = "id", required = false)
    @SerializedName("vod_id")
    private String vodId;

    /**
     * (*)名称
     */
    @Element(name = "name", required = false)
    @SerializedName("vod_name")
    private String vodName;

    /**
     * (*)图片
     */
    @Element(name = "pic", required = false)
    @SerializedName("vod_pic")
    private String vodPic;

    /**
     * 评分
     */
    @Element(name = "note", required = false)
    @SerializedName("vod_remarks")
    private String vodRemarks;

    @Element(name = "type", required = false)
    @SerializedName("type_name")
    private String typeName;
    /**
     * 年份
     */
    @Element(name = "year", required = false)
    @SerializedName("vod_year")
    private String vodYear;
    /**
     * 地区
     */
    @Element(name = "area", required = false)
    @SerializedName("vod_area")
    private String vodArea;
    /**
     * 导演艺术家
     */
    @Element(name = "director", required = false)
    @SerializedName("vod_director")
    private String vodDirector;
    /**
     * 演员艺术家
     */
    @Element(name = "actor", required = false)
    @SerializedName("vod_actor")
    private String vodActor;
    /**
     * 简介
     */
    @Element(name = "des", required = false)
    @SerializedName("vod_content")
    private String vodContent;

    /**
     * 播放来源
     */
    @SerializedName("vod_play_from")
    private String vodPlayFrom;

    /**
     * 播放地址(需要解析）
     */
    @SerializedName("vod_play_url")
    private String vodPlayUrl;

    @SerializedName("vod_tag")
    private String vodTag;

    /**
     * 点播列表（专辑）(这个需要适配转换而成,每一个列表标签下统协一个播放列表）
     */
    @Path("dl")
    @ElementList(entry = "dd", required = false, inline = true)
    @SerializedName("vod_Flags")
    private List<Flag> vodFlags;

    @SerializedName("land")
    private int land;

    @SerializedName("circle")
    private int circle;

    @SerializedName("ratio")
    private float ratio;

    @SerializedName("site_key")
    private String siteKey;

    /**
     * （）播放的标签(默认选中第一个)
     */
    private int playFlag = 0;
    /**
     * ()播放的选集（默认选中第一个）
     */
    private int playIndex = 0;

    /**
     * @return 不为Null
     */
    public List<Flag> getVodFlags() {
        return vodFlags = vodFlags == null ? new ArrayList<>() : vodFlags;
    }

    public String getSiteKey() {
        return siteKey;
    }

    public void setSiteKey(String siteKey) {
        this.siteKey = siteKey;
    }


    public String getVodId() {
        return vodId;
    }

    public void setVodId(String vodId) {
        this.vodId = vodId;
    }

    public String getVodName() {
        return vodName;
    }

    public void setVodName(String vodName) {
        this.vodName = vodName;
    }

    public String getTypeName() {
        return typeName;
    }

    public void setTypeName(String typeName) {
        this.typeName = typeName;
    }

    public String getVodPic() {
        return vodPic;
    }

    public void setVodPic(String vodPic) {
        this.vodPic = vodPic;
    }

    public String getVodRemarks() {
        return vodRemarks;
    }

    public void setVodRemarks(String vodRemarks) {
        this.vodRemarks = vodRemarks;
    }

    public String getVodYear() {
        return vodYear;
    }

    public void setVodYear(String vodYear) {
        this.vodYear = vodYear;
    }

    public String getVodArea() {
        return vodArea;
    }

    public void setVodArea(String vodArea) {
        this.vodArea = vodArea;
    }

    public String getVodDirector() {
        return vodDirector;
    }

    public void setVodDirector(String vodDirector) {
        this.vodDirector = vodDirector;
    }

    public String getVodActor() {
        return vodActor;
    }

    public void setVodActor(String vodActor) {
        this.vodActor = vodActor;
    }

    public String getVodContent() {
        return vodContent;
    }

    public void setVodContent(String vodContent) {
        this.vodContent = vodContent;
    }

    public String getVodPlayFrom() {
        return vodPlayFrom;
    }

    public void setVodPlayFrom(String vodPlayFrom) {
        this.vodPlayFrom = vodPlayFrom;
    }

    public String getVodPlayUrl() {
        return vodPlayUrl;
    }

    public void setVodPlayUrl(String vodPlayUrl) {
        this.vodPlayUrl = vodPlayUrl;
    }

    public String getVodTag() {
        return vodTag;
    }

    public void setVodTag(String vodTag) {
        this.vodTag = vodTag;
    }

    public int getPlayFlag() {
        return playFlag;
    }

    public void setPlayFlag(int playFlag) {
        this.playFlag = playFlag;
    }

    public int getPlayIndex() {
        return playIndex;
    }

    public void setPlayIndex(int playIndex) {
        this.playIndex = playIndex;
    }

    private void setVodFlags() {
        //从数据里解出点播数据
        if (getVodPlayFrom() == null || getVodPlayUrl() == null) {
            return;
        }
        String[] playFlags = getVodPlayFrom().split("\\$\\$\\$");
        String[] playUrls = getVodPlayUrl().split("\\$\\$\\$");

        for (int i = 0; i < playFlags.length; i++) {
            if (playFlags[i].isEmpty() || i >= playUrls.length) continue;
            Flag item = Flag.create(playFlags[i].trim());//创建标签
            item.createEpisode(playUrls[i]);//访标签下的播放集
            getVodFlags().add(item);//添加到本视频数据包
        }

        for (Flag item : getVodFlags()) {
            if (item.getUrls() == null) continue;
            item.createEpisode(item.getUrls());
        }
    }

    public static MediaBean objectFrom(JsonElement element) {
        return objectFrom(element, "");
    }

    public static MediaBean objectFrom(JsonElement element, String siteKey) {
        try {
            MediaBean bean = Init.json().fromJson(element, MediaBean.class);
            bean.setSiteKey(siteKey);
            bean.setVodFlags();
            return bean;
        } catch (Exception e) {
            Log.e("TAG", "初始化MediaBean json失败 " + e);
            e.printStackTrace();
            return new MediaBean();
        }
    }

    public static MediaBean objectFrom(String jsonStr) {
        try {
            MediaBean bean = Init.json().fromJson(jsonStr, MediaBean.class);
            bean.setVodFlags();
            return bean;
        } catch (Exception e) {
            Log.e("TAG", "初始化MediaBean json失败 " + e);
            e.printStackTrace();
            return new MediaBean();
        }
    }

    public int getVodEpisodeIndex() {
        return getVodEpisode().getIndex();
    }

    /**
     * 点播项的名字
     *
     * @return 名字
     */
    public String getVodEpisodeName() {
        return getVodEpisode() == null ? "" : getVodEpisode().getName();
    }

    /**
     * （*）点播项的 播放地址
     *
     * @return 播放地址
     */
    public String getVodEpisodeUrl() {
        return getVodEpisode() == null ? "" : getVodEpisode().getUrl();
    }

    private Episode getVodEpisode() {
        Flag vodFlag = getVodFlag();
        this.playIndex = vodFlag == null ? 0 : vodFlag.getPosition();
        return getVodEpisode(vodFlag, playIndex);
    }

    /**
     * 获取播放的剧集
     *
     * @param vodFlag      标签
     * @param episodeIndex 选中的剧集
     * @return Episode
     */
    private static Episode getVodEpisode(Flag vodFlag, int episodeIndex) {
        try {
            if (vodFlag == null || vodFlag.getEpisodes() == null || episodeIndex >= vodFlag.getEpisodes().size()) {
                return null;
            }
            return vodFlag.getEpisodes().get(episodeIndex);
        } catch (Exception e) {
            Logger.e("获取视频剧集时发生错误: ", e);
            return null;
        }
    }

    public String getVodFlagName() {
        return getVodFlag() == null ? "" : getVodFlag().getFlag();
    }

    /**
     * 获取当前播放的 Flag
     *
     * @return Flag 如果没有则返回null
     */
    private Flag getVodFlag() {
        if (this == null) {
            return null;
        }
        List<Flag> flags = getVodFlags();
        int playFlagIndex = getPlayFlag();
        if (flags == null || flags.isEmpty() || playFlagIndex >= flags.size()) {
            return null;
        }

        return flags.get(playFlagIndex);
    }

}
